﻿/*****************************************************
**Copyright(C), 2021-2022, Ciqtek Technology.
**Version:     1.0
**Author:      yhl
**Date:        2022/06/29
**Description: 数学工具
*****************************************************/

#ifndef MATHTOOLS_H
#define MATHTOOLS_H

#include "Base/NameSpace.h"
#include "Base/Singleton.h"
#include "common_global.h"
#include <QtMath>
#include <QImage>
#include <QRect>
#include <QFont>

BEGIN_NAMESPACE_CIQTEK

class COMMON_EXPORT MathTools
{

public:
	/**
	 * @brief  MathTools        构造函数
	 * @return  
	 */
	MathTools();

	/**
	 * @brief  ~MathTools       析构函数
	 * @return  
	 */
	~MathTools();

public:
    /**
     * @brief  generateRandomNumber     生成随机数
     * @return float                    随机数
     */
	static float generateRandomNumber();

    /**
     * @brief pointRotateTransform      坐标转换（将一个点p（x0,y0）围绕点p(x,y)，顺时针旋转一个角度r，得到QPointF）
     * @param x0                        任意一点坐标
     * @param y0
     * @param x                         中心点坐标
     * @param y
     * @param r                         旋转弧度
     * @param isDegree                  是否是角度
     * @return
     */
	static QPointF pointRotateTransform(double x0,double y0,double x,double y,double r,bool isDegree = false);

    /**
     * @brief distanceFromPointToLine   计算点到线向量的最短距离 px
     * @param point			            任意点
     * @param vector                    两点构成的线段
     * @return                          可能是点到线段端点的距离，或是点到直线的距离
     */
	static double distanceFromPointToLine(QPointF point,QVector<QPointF> vector);

    /**
     * @brief distanceFromPointToStraightLine   计算点到直线的最短距离 px
     * @param point
     * @param vector                            两个点
     * @return                                  点到直线的距离，用海伦公式面积计算，返回的是正值
     */
	static double distanceFromPointToStraightLine(QPointF point,QVector<QPointF> vector);

    /**
     * @brief distanceFromTwoPoint      计算两点之间的绝对距离 px
     * @param p1
     * @param p2
     * @return
     */
	static double distanceFromTwoPoint(QPointF p1,QPointF p2);

    /**
     * @brief getAngleByVector          根据三个点的向量，计算其角度
     * @param vector                    三个点
     * @return                          返回基于中点的角度
     */
	static double getAngleByVector(QVector<QPointF> vector);

    /**
     * @brief  calMarkPosLength     根据两点计算文本合适位置
     * @param  startPos             开始位置
     * @param  endPos               结束位置
     * @param  validRect            有效区域
     * @param  font                 文本字体
     * @param  text                 文本
     * @param  dScale               需要缩放的倍率
     * @return QRectF               返回的绘制区域
     */
    static QRectF calMarkPosLength(QPointF startPos, QPointF endPos, QRectF validRect, QFont font, QString text, double dScale = 1);

    /**
     * @brief  calMarkPosAngle  计算角度工具文本位置
     * @param  p1               第一个点
     * @param  p2               第二个点
     * @param  p3               第三个点
     * @param  validRect        有效区域
     * @param  font             文本字体
     * @param  text             文本
     * @param  dScale           坐标放大倍数
     * @return QRectF           返回的绘制区域
     */
    static QRectF calMarkPosAngle(QPointF p1, QPointF p2, QPointF p3, QRectF validRect, QFont font, QString text, double dScale = 1);

    /**
     * @brief getAngleByTwoPoint        计线段（p1,p2）在x，y轴方向夹角
     * @param p1
     * @param p2
     * @return                          QPointF(x, y)  x方向夹角   y方向夹角
     */
	static QPointF getAngleByTwoPoint(QPointF p1, QPointF p2);

    /**
     * @brief getParallelLinesByVector  根据vector的3个点，获取平行线段4个点
     * @param vector
     * @return
	 */
	static QVector<QPointF> getParallelLinesByVector(const QVector<QPointF> vector);

    /**
     * @brief getNumListFromStr         从字符串中拆出来数字
     * @param str
     * @return
     */
	static QVector<double> getNumListFromStr(const QString& str);
};

END_NAMESPACE_CIQTEK

#endif // MATHTOOLS_H
